kill & trap

SIGUP: 프로세스를 끊는다.
SIGINT: 프로세스를 중지시킨다.
SIGQUIT: 프로세스를 중단시킨다.
SIGKILL: 프로세스를 강제 종료한다.(무조건 종료)
SIGTERM: 가능하면 프로세스를 종료시킨다.
SIGSTOP: 무조건 프로세스를 중단시키지만, 종료시키지는 않음
SIGTSTP: 프로세스를 중단 또는 일시 중지하지만, 종료시키지는 않음
SIGCONT: 중단되었던 프로세스를 계속한다.
└─$ kill -l
 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
기본적으로 대화형 bash 쉘에서 SIGQUIT(3), SIGTERM(15)는 무시(ignore)한다.
SIGHUP(1)을 받으면 쉘을 종료하며, 종료하기 전에 실행하고 있는 쉘 스크립트를 포함하여 쉘어서 실행된 모든 프로세스에
SIGUP 신호를 전달한다.

SIGINT를 받으면 쉘을 잠시 중단시킨다. 리눅스 커널은 CPU에 쉘을 처리하는 시간을 주는 일(스케쥴링)을 중단하며,
쉘 스크립트에서 실행된 모든 프로세스에 SIGINT 신호를 전달한다.
bash 쉘은 default로 키보드 조합에 대하여 두 가지 기본 리눅스 신호를 매핑한다.
<Ctrl>+<C>: SIGINT 신호를 생성하고 현재 쉘에서 실행되는 프로세스로 전달
실행중인 프로세스를 중단 시키는 SIGINT 신호를 전송한다.
sleep 명령 같이 지정된 시간동안 작업을 중단시키는 명령은 종료시킴

<Ctrl>+<Z>: SIGTSTP 신호를 생성하고 현재 쉘에서 실행되는 프로세스로 전달
일시정지되어 있는 프로세스가 중유한(관리자 권한이 필요한) 파일의 잠금 상태를 열고 읽은 상태(메모리에 저장)에서 프로세스를
중단시키는 작업은 외부에서 관리자 권한 없이 스크립트 작업을 볼 수 있기 때문에 위험한 작업임

쉘이 할당한 작업이 중단된 상태로 쉘이 종료하려고 할 때, bash는 경고 메시지를 출력한다.
Signal Trap(시그널 핸들러, 인터럽트)
trap <commands> <signals>
trap을 이용해서 진행하고 있는 명령에서 trap으로 할당한 commands를 수행하도록 할 수 있다.
#!/bin/bash
trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT
echo This is a test script
count=1
while [ $count -le 10 ]; do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
echo "This is the end of the test script"
echo "This is the end of the test script"
This is a test script
Loop #1
Loop #2
Loop #3
^CSorry! I have trapped Ctrl-C
Loop #4
Loop #5
^CSorry! I have trapped Ctrl-C
Loop #6
Loop #7
^CSorry! I have trapped Ctrl-C
Loop #8
Loop #9
^CSorry! I have trapped Ctrl-C
Loop #10
This is the end of the test script
시그널이 트랩되면, trap에 지시했던 명령어를 수행하고, 다시 원래 프로세스 흐름으로 돌아감
스크립트 종료 트랩
trap을 signal 포착할 때 뿐 아닌, 쉘 스크립트가 종료될 때는 지정해서 작성할 수 있다.
쉘이 작업을 완료하려고 할 때, 명령을 실행할 수 있다.
#!/bin/bash
trap "echo Goodbye..." EXIT
count=1
while [ $count -le 5 ]; do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
trap 수정 및 제거
trap을 동일한 시그널에 대해서 다시 작성하게 되면, 이를 덮어쓰게 되며 이후로 나중에 정의된 trap을 따른다.

trap을 제거할 때 --(이중 대시)를 사용해서 기본 동작으로 되돌릴 수 있다.
(단일 대시만 사용해도 동일하게 동작함)
trap -- SIGINT
trap - SIGINT